/**
 * 配置验证测试
 * 
 * 用途：验证AppConfig配置系统和各组件的配置集成是否正常工作
 * 方法：测试配置文件加载、默认值设置、各组件配置使用等功能
 * 原理：通过单元测试确保配置系统按预期工作，所有硬编码值已被配置替代
 */
package com.example.brain_wave.test

import com.example.brain_wave.config.AppConfig
import com.example.brain_wave.bluetooth.cache.DataCacheManager
import com.example.brain_wave.data.AnalysisDataManager
import com.example.brain_wave.api.client.ApiClient
import com.example.brain_wave.api.client.SessionApiClient
import com.example.brain_wave.api.client.StoreRoomApiClient
import com.example.brain_wave.api.client.AnalysisApiClient
import org.junit.Test
import org.junit.Assert.*
import org.junit.Before
import android.content.Context
import androidx.test.core.app.ApplicationProvider

class ConfigurationValidationTest {
    
    private lateinit var context: Context
    private lateinit var appConfig: AppConfig
    
    @Before
    fun setUp() {
        context = ApplicationProvider.getApplicationContext<Context>()
        appConfig = AppConfig.getInstance(context)
    }
    
    @Test
    fun testAppConfigLoading() {
        // 验证AppConfig能正确加载配置
        assertNotNull("AppConfig实例不应为null", appConfig)
        
        // 验证超时配置
        assertTrue("连接超时应大于0", appConfig.connectTimeout > 0)
        assertTrue("写入超时应大于0", appConfig.writeTimeout > 0)
        assertTrue("读取超时应大于0", appConfig.readTimeout > 0)
        
        // 验证数据收集间隔配置
        assertTrue("数据收集间隔应大于0", appConfig.dataCollectionInterval > 0)
        
        // 验证缓存配置
        assertTrue("缓存最大大小应大于0", appConfig.cacheMaxSize > 0)
        assertTrue("缓存最大时间应大于0", appConfig.cacheMaxTime > 0)
        
        // 验证默认时间窗口配置
        assertTrue("默认时间窗口应大于0", appConfig.defaultTimeWindow > 0)
    }
    
    @Test
    fun testApiClientConfiguration() {
        // 测试ApiClient使用配置
        val apiClient = ApiClient(context)
        assertNotNull("ApiClient实例不应为null", apiClient)
        
        // 测试SessionApiClient使用配置
        val sessionApiClient = SessionApiClient(context)
        assertNotNull("SessionApiClient实例不应为null", sessionApiClient)
        
        // 测试StoreRoomApiClient使用配置
        val storeRoomApiClient = StoreRoomApiClient(context)
        assertNotNull("StoreRoomApiClient实例不应为null", storeRoomApiClient)
        
        // 测试AnalysisApiClient使用配置
        val analysisApiClient = AnalysisApiClient(context)
        assertNotNull("AnalysisApiClient实例不应为null", analysisApiClient)
    }
    
    @Test
    fun testDataCacheManagerConfiguration() {
        // 测试DataCacheManager使用配置
        val dataCacheManager = DataCacheManager(context)
        assertNotNull("DataCacheManager实例不应为null", dataCacheManager)
        
        // 验证缓存配置被正确应用
        // 注意：这里我们无法直接访问私有字段，但可以通过行为验证
        assertEquals("初始缓存大小应为0", 0, dataCacheManager.getCacheSize())
    }
    
    @Test
    fun testAnalysisDataManagerConfiguration() {
        // 测试AnalysisDataManager使用配置
        val analysisDataManager = AnalysisDataManager(context)
        assertNotNull("AnalysisDataManager实例不应为null", analysisDataManager)
    }
    
    @Test
    fun testConfigurationValues() {
        // 验证具体的配置值（基于config.properties中的设置）
        
        // API超时配置
        assertEquals("连接超时应为30秒", 30, appConfig.connectTimeout)
        assertEquals("写入超时应为30秒", 30, appConfig.writeTimeout)
        assertEquals("读取超时应为30秒", 30, appConfig.readTimeout)
        
        // 数据收集间隔配置
        assertEquals("数据收集间隔应为1000ms", 1000L, appConfig.dataCollectionInterval)
        
        // 缓存配置
        assertEquals("缓存最大大小应为300", 300, appConfig.cacheMaxSize)
        assertEquals("缓存最大时间应为3600000ms", 3600000L, appConfig.cacheMaxTime)
        
        // 默认时间窗口配置
        assertEquals("默认时间窗口应为30", 30, appConfig.defaultTimeWindow)
    }
    
    @Test
    fun testConfigurationDefaults() {
        // 测试配置的默认值机制
        // 这里可以通过修改配置文件或使用不存在的配置来测试默认值
        
        // 验证超时配置的默认值
        assertTrue("连接超时默认值应合理", appConfig.connectTimeout >= 10)
        assertTrue("写入超时默认值应合理", appConfig.writeTimeout >= 10)
        assertTrue("读取超时默认值应合理", appConfig.readTimeout >= 10)
        
        // 验证数据收集间隔的默认值
        assertTrue("数据收集间隔默认值应合理", appConfig.dataCollectionInterval >= 100)
        
        // 验证缓存配置的默认值
        assertTrue("缓存最大大小默认值应合理", appConfig.cacheMaxSize >= 100)
        assertTrue("缓存最大时间默认值应合理", appConfig.cacheMaxTime >= 60000)
    }
    
    @Test
    fun testMultipleConfigInstances() {
        // 验证AppConfig单例模式工作正常
        val config1 = AppConfig.getInstance(context)
        val config2 = AppConfig.getInstance(context)
        
        assertSame("AppConfig应该是单例", config1, config2)
        assertEquals("两个实例的配置值应该相同", config1.connectTimeout, config2.connectTimeout)
    }
}